package org.yzhzc.friend.repository.question;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.annotations.Query;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;
import org.yzhzc.friend.domain.question.es.QuestionES;

/**
 * 题目 Elasticsearch 数据访问接口。
 * 提供基于题目难度、标题和内容的查询方法，支持分页查询。
 */
@Repository
public interface QuestionRepository extends ElasticsearchRepository<QuestionES, Long> {

    /**
     * 根据题目难度查询题目列表。
     *
     * @param difficulty 题目难度
     * @param pageable   分页信息
     * @return 题目列表的分页结果
     */
    Page<QuestionES> findQuestionByDifficulty(Integer difficulty, Pageable pageable);

    /**
     * 根据标题或内容以及题目难度查询题目列表。
     * 查询条件：标题或内容包含关键字，且题目难度匹配。
     * 相当于 SQL: SELECT * FROM tb_question WHERE (title LIKE '%aaa%' OR content LIKE '%bbb%') AND difficulty = 1
     *
     * @param keywordTitle   标题关键字
     * @param keywordContent 内容关键字
     * @param difficulty     题目难度
     * @param pageable       分页信息
     * @return 题目列表的分页结果
     */
    @Query("{\"bool\": {\"should\": [{ \"match\": { \"title\": \"?0\" } }, { \"match\": { \"content\": \"?1\" } }], \"minimum_should_match\": 1, \"must\": [{\"term\": {\"difficulty\": \"?2\"}}]}}")
    Page<QuestionES> findByTitleOrContentAndDifficulty(String keywordTitle, String keywordContent, Integer difficulty, Pageable pageable);

    /**
     * 根据标题或内容查询题目列表。
     * 查询条件：标题或内容包含关键字。
     *
     * @param keywordTitle   标题关键字
     * @param keywordContent 内容关键字
     * @param pageable       分页信息
     * @return 题目列表的分页结果
     */
    @Query("{\"bool\": {\"should\": [{ \"match\": { \"title\": \"?0\" } }, { \"match\": { \"content\": \"?1\" } }], \"minimum_should_match\": 1}}")
    Page<QuestionES> findByTitleOrContent(String keywordTitle, String keywordContent, Pageable pageable);
}